import json
import frida


def modify_exam_answers(s_pid):
    """
    封装的函数，通过 ADB 和 Frida 实现对试题答案的修改

    :param s_pid: 应用的包名，如 "com.fenbi.android.leo"
    """

    # 通过链接到虚拟机frida-server
    try:
        device = frida.get_usb_device()
        session = device.attach(s_pid)

        # 加载 js 文件
        with open("js/submit_model.js", encoding='utf-8') as f:
            script = session.create_script(f.read())

        # 设置控制台消息处理程序
        def on_message(message, data):
            if message['type'] == 'send':
                try:
                    bytes_obj = bytes.fromhex(message['payload'])
                    string = bytes_obj.decode('utf-8')
                    string = string.replace(r'\"', "%")
                    # 修正 null 不加引号导致的错误
                    string = string.replace("null", '"null"')
                    # print("字符串: ", string)
                    json_data = json.loads(string)
                    # print(json_data)
                    print('原始花费时间：', json_data['costTime'])
                    # TODO: 时间不要修改为0，最低为1，否则会有难以解决的错误
                    json_data['costTime'] = 1
                    print('现在花费时间：', json_data['costTime'])
                    # print(json_data)
                    data = str(json_data).replace('%', r'\"')
                    data = str(data).replace('\'', '\"')
                    data = str(data).replace(' ', '')
                    script.post({'type': 'send', 'my_data': data})
                except Exception as a:
                    print(f"处理消息时发生错误: {a}")
            else:
                print("[{}] {}".format(message['type'], message['description']))

        # 设置消息处理程序
        script.on('message', on_message)

        # 加载 js 文件并获取脚本输出的信息
        script.load()

    except frida.ServerNotRunningError:
        print("Frida server 未运行，请确保 Frida server 已启动。")
    except Exception as e:
        print(f"发生错误: {e}")


# 调用封装的函数
# modify_exam_answers("com.fenbi.android.leo", "js/submit_model.js")
